﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web.UI.WebControls;
using System.ComponentModel;
using System.Web.UI;

namespace Web.Framework.Controls
{
    //Clases
    //cPlanProdMain
    //cPlanProdTable
    //cPlanProdRowPar
    //cPlanProdRowImpar
    //cPlanProdTableHeader
    //cPlanProdInvisible
    //cPlanProdInputCant
    //cPlanProdTdTotal
    //cPlanProdInputTotal

    [DefaultProperty("Text"), ToolboxData("<{0}:PlanProdDetalleProductoCtrl runat=server></{0}:PlanProdDetalleProductoCtrl>")]
    //[Designer(typeof(WebGridCtrlDesign))]
    //[DefaultEvent("OnRowChange")]
    public class PlanProdDetalleProductoCtrl : WebControl
    {
        public CantidadesProducto ProductoDataSource { get; set; }

        public CantidadesProducto ProductoSegundaDataSource { get; set; }

        public int CellPadding { get; set; }

        public int CellSpacing { get; set; }

        public int TableBorder { get; set; }

        public bool InputsReadOnly { get; set; }

        public TemporadaComercial BindTemporada { get; set; }

        public string DescPrimera = "Primera";

        public string DescSegunda = "Segunda";

        /// <summary>
        /// Render this control to the output parameter specified.
        /// </summary>
        /// <param name="output"> The HTML writer to write out to </param>
        protected override void Render(HtmlTextWriter output)
        {
            CellPadding = 2;

            StringBuilder builder = new StringBuilder();
            builder.AppendFormat("<div class='cPlanProdMain' id='{0}' >", this.ClientID);

            builder.AppendFormat("<table cellpadding='{0}' cellspacing='{1}' border='{2}' class='cPlanProdTable' width='100%' >", CellPadding, CellSpacing, TableBorder);

            // Header

            builder.Append("<tr class='cPlanProdTableHeader' >");
            builder.Append("<td class='cPlanProdInvisible'>Id</td>");
            builder.Append("<td class='cPlanProdTipoHeaderTd'>Tipo</td>");
            builder.Append("<td class='cPlanProdTipoHeaderTd'>C&oacute;digo</td>");


            List<Semana> semanaList = BindTemporada.GetSemanas().ToList();
            SortSemanas(semanaList);

            foreach (var semana in semanaList)
            {
                builder.AppendFormat("<td class='cPlanProdSemTd' title='{1} al {2}'>Sem-{0}</td>", semana.NumeroSemana, semana.Desde.ToString("dd/MM/yyyy"), semana.Hasta.ToString("dd/MM/yyyy"));
            }

            // Una final con el total
            builder.Append("<td class='cPlanProdHeaderTdTotal'>Total</td>");

            builder.Append("</tr>");

            // fin header

            if (ProductoDataSource != null)
            {
                CreateRowForWeekAmounts(builder, ProductoDataSource, 1);
                if (ProductoSegundaDataSource != null)
                {
                    CreateRowForWeekAmounts(builder, ProductoSegundaDataSource, 2);
                }
            }

            builder.Append("</table>");

            builder.Append("</div>");          

            output.Write(builder.ToString());
        }

        private void CreateRowForWeekAmounts(StringBuilder builder, CantidadesProducto productoDataSource, int fila)
        {
            int columnaSemana = 0;
            int totalPorFila = 0;

            bool esPar = true;

            builder.AppendFormat("<tr class='{0}' id='{1}_tr_row_{2}' >", esPar ? "cPlanProdRowPar" : "cPlanProdRowImpar", this.ClientID, productoDataSource.Id);

            // Item  Id
            builder.AppendFormat("<td class='cPlanProdInvisible' innerId='{0}' id='{2}_td_id' productoId='{3}'>{1}</td>", productoDataSource.Id, productoDataSource.Id, this.ClientID, productoDataSource.ProductoId);
            builder.AppendFormat("<td>{0}</td>", fila == 1 ? DescPrimera : DescSegunda);

            // Codigo de producto
            builder.AppendFormat("<td title='{2}-{3}'>{0}{1}</td>", productoDataSource.ProductoIdExterno, productoDataSource.ColorId, productoDataSource.ProductoNombre, productoDataSource.Color);

            // Los TDs por temporada
            columnaSemana = 0;
            totalPorFila = 0;
            string clase;

            List<SemanaCantidadProducto> semanaListForData = productoDataSource.Semanas.ToList();
            SortSemanas(semanaListForData);

            foreach (SemanaCantidadProducto semana in semanaListForData)
            {
                clase = InputsReadOnly ? "cPlanProdInputCant inputreadonly" : "cPlanProdInputCant";
                if (semana.Destacar)
                {
                    clase += " cPlanProdInputCantDestacado";
                }
                builder.AppendFormat(" <td innerId='{0}' class='cPlanProdDataTd'> ", semana.NumeroSemana);
                builder.AppendFormat(" <input  id='{0}_planprodcant_{1}_{2}' name='{0}_planprodcant_{1}_{2}' ", this.ClientID, columnaSemana, fila);
                builder.AppendFormat(" value='{0}' oldValue='{0}' ", semana.Cantidad);
                builder.AppendFormat(" class='{1}' type='text' {0} /> ", InputsReadOnly ? "readonly='readonly'" : string.Empty, clase);
                builder.Append("</td>");
                columnaSemana++;
                totalPorFila += semana.Cantidad;
            }

            builder.AppendFormat("<td class='cPlanProdTdTotal'><input class='cPlanProdInputTotal' readonly='readonly' id='{0}_planprodtotal_{2}' type='text' value='{1}' oldValue='{1}' /></td>", this.ClientID, totalPorFila, fila);

            builder.Append("</tr>");
        }

        private void SortSemanas(List<SemanaCantidadProducto> semanaList)
        {
            semanaList.Sort((x, y) =>
            {
                if (x.Anio == y.Anio)
                {
                    return x.NumeroSemana - y.NumeroSemana;
                }
                else
                {
                    return x.Anio - y.Anio;
                }
            });
        }

        private void SortSemanas(List<Semana> semanaList)
        {
            semanaList.Sort((x, y) =>
            {
                if (x.Anio == y.Anio)
                {
                    return x.NumeroSemana - y.NumeroSemana;
                }
                else
                {
                    return x.Anio - y.Anio;
                }
            });
        }

    }
}
